package designPatterns.工厂方法;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;

public class AbstractFactoryTest {

    public static void main(String[] args) {
        Product a;
        AbstractFactory af;
        af = (AbstractFactory)ReadXML1.getObject();
        a = af.newProduct();
        a.show();
    }

}

interface Product{
    public void show();
}

interface AbstractFactory{
    public Product newProduct();
}

class ConcreteFactory1 implements AbstractFactory{

    @Override
    public Product newProduct() {
        System.out.println("具体工厂1生成-->具体产品1...");
        return new ConcreteProduct1();
    }
}


class ConcreteFactory2 implements AbstractFactory{

    @Override
    public Product newProduct() {
        System.out.println("具体工厂2生成-->具体产品2...");
        return new ConcreteProduct2();
    }
}

class ConcreteProduct1 implements Product{

    @Override
    public void show() {
        System.out.println("具体产品1显示。。");
    }
}

class ConcreteProduct2 implements Product{

    @Override
    public void show() {
        System.out.println("具体产品2显示。。");
    }
}

class ReadXML1
{
    //该方法用于从XML配置文件中提取具体类类名，并返回一个实例对象
    public static Object getObject()
    {
        try
        {
            //创建文档对象
            DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
            DocumentBuilder builder=dFactory.newDocumentBuilder();
            Document doc;
            doc=builder.parse(new File("src/config1.xml"));
            //获取包含类名的文本节点
            NodeList nl=doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName="designPatterns.工厂方法."+classNode.getNodeValue();
            System.out.println("新类名："+cName);
            //通过类名生成实例对象并将其返回
            Class<?> c=Class.forName(cName);
            Object obj=c.newInstance();
            return obj;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}